package com.requiem.hist_group_manage_springboot.common;

import org.springframework.stereotype.Component;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class TimeParserUtil {
    private final Pattern PATTERN = Pattern.compile("^(\\d+\\.?\\d*)([dhm sms])$", Pattern.CASE_INSENSITIVE);

    /**
     * 将带单位的时间字符串转换为毫秒数
     *
     * @param timeStr 如"7d"、"3.5h"、"10m"
     * @return 转换后的毫秒数
     * @throws IllegalArgumentException 格式错误时抛出
     */
    public long parseToMillis(String timeStr) {
        if (timeStr == null || timeStr.trim().isEmpty()) {
            throw new IllegalArgumentException("时间配置不能为空");
        }

        Matcher matcher = PATTERN.matcher(timeStr.trim());
        if (!matcher.matches()) {
            throw new IllegalArgumentException("时间格式错误，正确格式如：7d、3h、5m、2s、100ms");
        }
        // 提取数字部分（可能是整数或小数）
        double number = Double.parseDouble(matcher.group(1));
        // 提取单位（转换为小写，统一处理）
        String unit = matcher.group(2).toLowerCase();

        // 根据单位转换为毫秒
        return switch (unit) {
            case "d" -> // 天（1天=24h=86400s=86400000ms）
                    (long) (number * 86400000);
            case "h" -> // 小时（1h=3600s=3600000ms）
                    (long) (number * 3600000);
            case "m" -> // 分钟（1m=60s=60000ms）
                    (long) (number * 60000);
            case "s" -> // 秒（1s=1000ms）
                    (long) (number * 1000);
            case "ms" -> // 毫秒
                    (long) number;
            default -> throw new IllegalArgumentException("不支持的单位：" + unit);
        };
    }

    public String formatMillisToTimeString(long millis) {
        if (millis < 0) {
            throw new IllegalArgumentException("毫秒数不能为负数");
        }

        // 定义各单位与毫秒的换算关系
        double days = millis / 86400000.0;
        if (days >= 1) {
            return formatNumber(days) + "d";
        }

        double hours = millis / 3600000.0;
        if (hours >= 1) {
            return formatNumber(hours) + "h";
        }

        double minutes = millis / 60000.0;
        if (minutes >= 1) {
            return formatNumber(minutes) + "m";
        }

        double seconds = millis / 1000.0;
        if (seconds >= 1) {
            return formatNumber(seconds) + "s";
        }

        // 小于1秒的情况，使用毫秒
        return millis + "ms";
    }

    // 格式化数字，移除不必要的小数部分
    private String formatNumber(double number) {
        // 如果是整数，返回整数形式，否则保留合理的小数位数
        if (number == Math.floor(number)) {
            return String.valueOf((long) number);
        } else {
            // 保留一位小数
            return String.format("%.1f", number).replace(".0", "");
        }
    }

}